home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 7 / Night Owl Shareware (NOPV7)(Night Owl Publisher Inc.)(1992).bin / 038a / bash1_12.arj / BASH1-12.TAR / bash-1.12 / builtins / exec.def < prev    next >
Text File  |  1991-10-30  |  4KB  |  128 lines

  1. This file is exec.def, from which is created exec.c.
  2. It implements the builtin "exec" in Bash.
  3.  
  4. Copyright (C) 1987, 1989, 1991 Free Software Foundation, Inc.
  5.  
  6. This file is part of GNU Bash, the Bourne Again SHell.
  7.  
  8. Bash is free software; you can redistribute it and/or modify it under
  9. the terms of the GNU General Public License as published by the Free
  10. Software Foundation; either version 1, or (at your option) any later
  11. version.
  12.  
  13. Bash is distributed in the hope that it will be useful, but WITHOUT ANY
  14. WARRANTY; without even the implied warranty of MERCHANTABILITY or
  15. FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  16. for more details.
  17.  
  18. You should have received a copy of the GNU General Public License along
  19. with Bash; see the file COPYING.  If not, write to the Free Software
  20. Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  
  22. $PRODUCES exec.c
  23.  
  24. $BUILTIN exec
  25. $FUNCTION exec_builtin
  26. $SHORT_DOC exec [ [-] file [redirection ...]]
  27. Exec FILE, replacing this shell with the specified program.
  28. If FILE is not specified, the redirections take effect in this
  29. shell.  If the first argument is `-', then place a dash in the
  30. zeroth arg passed to FILE.  This is what login does.  If the file
  31. cannot be exec'ed for some reason, the shell exits, unless the
  32. shell variable "no_exit_on_failed_exec" exists.
  33. $END
  34.  
  35. #include "../shell.h"
  36. #include <sys/types.h>
  37. #include <signal.h>
  38. #include <errno.h>
  39.  
  40. extern int interactive, errno;
  41. extern REDIRECT *redirection_undo_list;
  42.  
  43. int
  44. exec_builtin (list)
  45.      WORD_LIST *list;
  46. {
  47.   extern char *find_user_command ();
  48.  
  49.   maybe_make_export_env ();
  50.  
  51.   /* First, let the redirections remain. */
  52.   dispose_redirects (redirection_undo_list);
  53.   redirection_undo_list = (REDIRECT *)NULL;
  54.  
  55.   if (!list)
  56.     return (EXECUTION_SUCCESS);
  57.   else
  58.     {
  59.       /* Otherwise, execve the new command with args. */
  60.       char *command, **args;
  61.       int dash_name = 0;
  62.  
  63.       if (strcmp (list->word->word, "-") == 0)
  64.     {
  65.       /* The user would like to exec this command as if it was a
  66.          login command.  Do so. */
  67.       list = list->next;
  68.       dash_name++;
  69.     }
  70.  
  71.       if (!list)
  72.     return (EXECUTION_SUCCESS);
  73.  
  74.       args = (char **)make_word_array (list);
  75.  
  76.       /* A command with a slash anywhere in its name is not looked up in
  77.      the search path. */
  78.       if (absolute_program (args[0]))
  79.     command = args[0];
  80.       else
  81.     command = find_user_command (args[0]);
  82.       if (!command)
  83.     {
  84.       builtin_error ("%s: not found", args[0]);
  85.       goto failed_exec;
  86.     }
  87.  
  88.       command = (char *)full_pathname (command);
  89.       /* If the user wants this to look like a login shell, then
  90.      prepend a `-' onto the first argument (argv[0]). */
  91.       if (dash_name)
  92.     {
  93.       char *new_name = (char *)xmalloc (2 + strlen (args[0]));
  94.       strcpy (new_name, "-");
  95.       strcat (new_name, args[0]);
  96.       free (args[0]);
  97.       args[0] = new_name;
  98.     }
  99.  
  100.       /* Decrement SHLVL by 1 so a new shell started here has the same value,
  101.      preserving the appearance.  After we do that, we need to change the
  102.      exported environment to include the new value. */
  103.       adjust_shell_level (-1);
  104.       maybe_make_export_env ();
  105.  
  106.       maybe_save_shell_history ();
  107.  
  108.       restore_default_signal (SIGINT);
  109.       restore_default_signal (SIGQUIT);
  110.       restore_default_signal (SIGTERM);
  111.       restore_original_signals ();
  112.  
  113.       shell_execve (command, args, export_env);
  114.  
  115.       adjust_shell_level (1);
  116.  
  117.       if (!executable_file (command))
  118.     builtin_error ("%s: cannot execute: %s", command, strerror (errno));
  119.       else
  120.     file_error (command);
  121.  
  122.   failed_exec:
  123.       if (!interactive && !find_variable ("no_exit_on_failed_exec"))
  124.     exit (EXECUTION_FAILURE);
  125.       return (EXECUTION_FAILURE);
  126.     }
  127. }
  128.